package com.dayuanit.dy15.lesson24.demo1;

public class Test {
    /**
     * 冒泡排序
     * @param nums
     */
    public static void maopao(int[] nums) {
        for (int i=0; i<nums.length; i++) {
            for (int j=0; j<nums.length - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }
    }

    /**
     * 选择排序
     * @param nums
     */
    public static void xuanzhe(int[] nums) {
        for (int i=0; i<nums.length-1; i ++) {
            int min = i;//假设第i的下标值是最小的
            for (int j = i + 1; j < nums.length; j++) {
                //比较谁最小，将最小值下标赋值给min;
                if (nums[min] > nums[j]) {
                    min = j;
                }
            }

            //校验假设是否正确？
            if (min != i) {
                int temp = nums[min];
                nums[min] = nums[i];
                nums[i] = temp;
            }
        }
    }

    /**
     * 插入排序 当排序的数字大部分都是有序的情况下，那么插入排序的速度有可能比快速排序还要快。
     * @param nums
     */
    public static void charuSort(int[] nums) {
        for (int i=1; i<nums.length; i++) {
            for (int j=i; j > 0 ; j--) {
                if (nums[j] > nums[j - 1]) {
                    //交换位置
                    swap(nums, j, j - 1);
                }
            }
        }
    }

    /**
     * 交换数字
     * @param nums
     * @param a 第一个下标
     * @param b 第二个下标
     */
    private static void swap(int[] nums, int a, int b) {
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp;
    }

    public static void main(String[] args) {
        //初级排序：冒泡 选择 插入 希尔
        //高级排序：归并 堆排序 快速
        //低等排序：猴子排序
        int[] nums = {2, 1, 9, 5, 5, 3};
//        charuSort(nums);
        xuanzhe(nums);
        for (int num : nums) {
            System.out.print(num);
        }
    }
}
